package com.beantools.annotation;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;

/**
 * 这是处理<code>javabean</code>对象的的注解类。其可以作用在属性、实体类、方法上。
 * 如果其作用在类上面，说明这个类的所有属性都不能为空，比如代码:
 * <pre>
 *     <code>
 *          @NotNull
 *         public class Student{
 *             private String name;
 *             private String no;
 *         }
 *     </code>
 * </pre>
 * 如果其作用在属性上，说明这个属性或方法不能为空，比如代码：
 * <pre>
 *     <code>
 *         public class Student{
 *             @NotNull
 *             private String name;
 *              private String no;
 *         }
 *     </code>
 * </pre>
 * 如果其作用在<code>getter</code>方法上，说明这个方法不能为空，比如代码：
 * <pre>
 *     <code>
 *         public class Student{
 *             private String name;
 *              private String no;
 *              @NotNull
 *              public String getName(){return this.name}
 *              public String getNo(){return this.no }
 *         }
 *     </code>
 * </pre>
 *
 * @author baoya
 * @version 1.0
 * @since 1.1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD})
@Documented
public @interface NotNull {

    /**
     * 这个关键字指明如果<code>NotNull</code>在实体类上，但调用希望大部分
     * 属性不能为{@code null}，但某些属性可以为{@code null},因而，在此关键字
     * 中的所有属性都可以为{@code null}，比如
     * <pre>
     *     <code>
     *         @NotNull(ignore={"name"})
     *         public class Student{
     *             private String name;
     *              private String no;
     *              public String getName(){return this.name}
     *              public String getNo(){return this.no }
     *         }
     *     </code>
     * </pre>
     */
    String[] ignore() default "";

    /**
     * 这个关键字指明如果<code>NotNull</code>在实体类上，但调用希望大部分
     * 属性为{@code null}，但某些属性不可以为{@code null},因而，在此关键字
     * 中的所有属性都不可以为{@code null}，比如
     * <pre>
     *     <code>
     *         @NotNull(notNull={"name"})
     *         public class Student{
     *             private String name;
     *              private String no;
     *              public String getName(){return this.name}
     *              public String getNo(){return this.no }
     *         }
     *     </code>
     * </pre>
     */
    String[] notNull() default "";

    /**
     * 这是<code>includingSupClass</code>关键字，主要判断该注解是否包含父类属性也不能为空。
     * <pre>
     *     <code>
     *          public class Parent{
     *             private String name;
     *         }
     *         @NotNull(includingSubClass=true)
     *         public class Child extends Parent{
     *              private String no;
     *         }
     *     </code>
     * </pre>
     */
    boolean includingSupClass() default false;
}
